In this next tutorial, you're going to extend the usefulness of the
Black Box operator type by building a new Black Box that will allow you
to pipe data into it. The first tutorial showed you the basics of creating
a re-usable, self contained particle system, however, this is NOT the
only use for Black Boxes. Most of the time, you'll want to create them
so that you can pump data into or out of them as well, and this was not
possible with the previous example.
So the first thing you need to do is build a quick and dirty Black Box
for velocity based on Particle Age.
Reset 3ds Max, then create a new thinkingParticles icon in any viewport.
Click on Properties to access the thinkingParticles dialog.
What you're going to do is add two operators to a new group.
In the DynamicSet Tree View, click Create to create a new DynamicSet. Name it speed.
With the new speed DynamicSet selected, go to the Create rollout and choose the Conditions icon.
Add a Particle Age Condition to the Wire Setup View.
Next, go to the Operators icon and from the Standard group of operators, select Velocity and add it to the Wire Setup View.

Both operators in the speed DynamicSet
As you can see, both the Particle Age and Velocity operators are looking
for a Particle input, and at the moment the speed DynamicSet is showing
as Invalid. But as you want to create this as a Black Box, you may not
want to use just one type of particle generator operator. All you want
this Black Box to do is control the speed of particles, not determine
how they are generated. So you're going to do something different - you're
going to utilize global input data streams to make this
Black Box valid.
Within the Particle Age Condition, drag a wire from the Particle input data stream to the global input data stream box in the upper left side of the speed DynamicSet Wire Setup window.

Particle Age connected to the global DynamicSet input port
Repeat this process with the Velocity Operator's Particle input data stream and connect it to the global Particle input data stream.

Velocity connected to the global DynamicSet input port
When you connect the Velocity operator, you'll notice that while the global
input data stream shows the Particle input in yellow (which means it needs
an input stream), the speed DynamicSet now becomes Valid. This is because
that this DynamicSet will now rely on another operator's input into the
Particle port to "activate it. This may be a bit confusing at the
moment, but it will become clear in a moment.
Before you save out your Black Box, you have one more connection to make.
Select the Velocity Operator, and from the Input data stream side make the ON input data stream is visible.
Once visible, connect the Particle Age Out output data stream to the Velocity ON input data stream as shown below.

Now it's time to save this DynamicSet as a Black Box.
Within the speed Wire Setup View, click on the Save button to save out the DynamicSet as a Black Box.
Leave the default file name in the dialog and click Save.
You've now got a saved Black Box that is going to rely on another input
to make it work. Let's set up that new system now.
Highlight the speed DynamicSet in the Tree View and click Remove.
Now, you need to build a new DynamicSet to create some particles.
In the DynamicSet Tree View, click Create to create a new DynamicSet. Name the new DynamicSet Generate.
With the new Generate DynamicSet selected, within the Create rollout, click on the Operators icon.
Make sure Generator is selected from the dropdown menu then add a Particle Draw operator to the Wire Setup View.
The Particle Draw operator lets you draw where you want particles to
be emitted from.
Within the ParticleDraw rollout, change the type from One Particle to Radial, the Count value to 25 and the Life Span to 100.
Next click the Draw Particle button, and within the Perspective viewport, click two or three times to set points.
Right-click to exit the Draw Particle mode.
When you are drawing particles, you won't see much visual feedback in
the viewports, however, when you exit the Draw Particle mode, you'll see
clumps of red dots that indicate where the particles have been placed.
Press the Play button.
The ticks that represent the particles now show up in the viewports.

As you can see, the particles now exist in the viewports, but they are
not going anywhere. This is where the Black Box you just created will
come in handy.
With the Generate DynamicSet still selected, click on the Black Box icon, then add the speed Black Box to your Wire Setup View.

When you add the speed Black Box to your Generate DynamicSet, you'll notice
that you get the new speed node in the Wire Setup view, and that it has
a single input data stream called Particle. You'll also
see that it shows up in yellow and has made the Generate DynamicSet Invalid.
This is due to the fact that the speed Black Box requires a Particle input
data stream to be connected.
Finally, you'll notice that you automatically see the components of the
underlying speed DynamicSet when you select the Generate DynamicSet. If
you look at the DynamicSet Tree View, you'll notice that the speed DynamicSet
is now a sub-DynamicSet of the Generate one as shown below.

All that's left to do now is connect the two nodes in the Generate DynamicSet.
Drag the Particle input data stream from the speed Black Box to the Born Particle output data stream of the Particle Draw Operator.
The Generate DynamicSet now becomes Valid again.
Click Play to watch the animation in the Perspective viewport.
The particles now have an upward motion that was not previously there.
Of course, it's pretty uninteresting as all of the particles move with
the same velocity, so let's tweak the speed Black Box a bit.
Select the Velocity Operator in the speed Black Box.
In the rollout, change the Speed value to 3, the Variation % value to 100, and the Variation Angle value to 20.
Click Play again to watch the animation in the Perspective viewport.
Now that's a bit more interesting. The particles move randomly up, almost
like three simultaneous small explosions.
You should now have a better idea of how Black Boxes can help you create
modular components for your particle systems that can be re-used and inter-connected
through the use of the global input and output data streams. When combined
with the DynamicSet Tree View hierarchies, you can quickly build up some
impressive particle animation.
On your own, you might want to try to create another sub-DynamicSet for
the Generate one that contains other operators that control the particles'
shape (so they can be rendered) and size.